//
// Created by 徐套 on 2023/10/8.
//

#include "car_contral.h"


car_contral::~car_contral() {
    car_server.clear();
    std::cout<<"car contral is free"<<std::endl;
}

void car_contral::add_car_server(const std::shared_ptr<cloud_server>& ser) {
    car_server.push_back(ser);
}

bool car_contral::have_car_server() {
    return !car_server.empty();
}

bool car_contral::send_msg_by_tcp(char *msg) {
    std::string sign;
    sign = msg[2] + msg[3] + msg[4];
    if (sign == "000"){
        for(const auto& i:car_server){
            i->send_msg_by_tcp(msg);
        }
        return true;
    } else{
        for(const auto& i:car_server){
            if(i->name_sign == sign){
                i->send_msg_by_tcp(msg);
                return true;
            }
        }
    }
    return false;
}

void car_contral::send_msg_by_udp(char *msg) {

}

std::string car_contral::get_time_late() {
    std::string msg;
    msg = "5:";
    if (car_server.empty())
        return msg;

    for(const auto& i:car_server){
        msg += i->get_name() + ":" + std::to_string(i->get_time_late()) + ";";
    }
    return msg;
}

std::string car_contral::is_alive() {
    std::string msg;
    msg = "2:";
    if (car_server.empty())
        return msg;
    for(const auto& i:car_server){
        if (!i->is_alive())
            msg += i->get_name() + "!0!;";
        else
            msg += i->get_name() + "!1!;";
    }
    return msg;
}

void car_contral::alive(){
    std::vector<int> del_server;
    for(auto i = car_server.begin(); i != car_server.end(); i++){
        if (*i == nullptr)
            break;
        if (!(*i)->is_alive()) {
            car_server.erase(i);
        }
    }
}

void car_contral::pop_server(int ser) {
    for(int i = 0; i < car_server.size(); ++i){
        if (i == ser){
            car_server[i] = nullptr;
            break;
        }
    }
}

AllCar car_contral::get_all_state() {
    memset(&car_, 0, sizeof(car_));
    if (car_server.empty())
        return car_;
    int i = 0;
    for (; i < car_server.size(); ++i){
        CarState car;
        memset(&car, 0, sizeof(car));
        car = *car_server[i]->get_now_state();
        car_.all[i] = car;
    }
    car_.num = i;
    return car_;

}

void car_contral::reset() {
//    for (int i = 0; i < car_server.size(); i++){
//        if (!car_server[i])
//
//    }

}